import { setToken, getToken, removeToken, setTimeStamp } from '@/utils/auth'
import { login, getUserInfo, getUserDetailById } from '@/api/user'
import { resetRouter } from '@/router'

const state = {
  token: getToken(), // 设置token的共享状态,初始化Vuex时就从缓存中读取
  userInfo: {}// 这里定义一个空对象,因为getters中引用userInfo的变量，如果设置为null，则会引起报错
}
// 修改状态
const mutations = {
  // 外部调用时，传入token，会修改Vuex和cookie中的token
  setToken(state, Token) {
    state.token = Token // 将token令牌传给Vuex
    setToken(Token) // 将token令牌存入cookie
  },

  // 外部调用时，传入token，会删除Vuex和cookie中的token
  removeToken(state) {
    state.token = '' // 删除Vuex中的token令牌
    removeToken()
  },

  // 存储用户信息
  setUserInfo(state, info) {
    state.userInfo = info// 这样是响应式
  },
  removeUserInfo(state) {
    state.userInfo = {}
  }
}

// 执行异步
const actions = {
  async login(context, data) {
    const res = await login(data) // 调用api接口
    console.log(res)
    if (res) {
      // 想要修改state，需要通过mutation。
      context.commit('setToken', res)// 设置token
      setTimeStamp()// 设置当前的时间戳
    }
  },
  async getUserInfo(context) {
    const res = await getUserInfo()
    const detailInfo = await getUserDetailById(res.userId)
    const detailRes = { ...res, ...detailInfo }// 把基本资料和详情资料合并为一个整体
    context.commit('setUserInfo', detailRes)
    console.log(detailRes)
    return res
    // 这里为什么要return呢 这是后期做权限处理的时候留下的伏笔
  },
  logout(context) {
    // 删除token
    context.commit('removeToken')
    // 删除用户资料
    context.commit('removeUserInfo')
    resetRouter()// 重置路由

    // 权限模块下的路由也需要重置
    // 还有一步  vuex中的数据是不是还在
    // 要清空permission模块下的state数据
    // vuex中 user子模块  permission子模块
    // 子模块调用子模块的action  默认情况下 子模块的context是子模块的
    // 父模块 调用 子模块的action
    context.commit('permission/setRoutes', [], { root: true })
    // 子模块调用子模块的action 可以 将 commit的第三个参数 设置成  { root: true } 就表示当前的context不是子模块了 而是父模块
  }
}

// 向外导出
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
